#!/bin/sh
#

# PROVIDE: nuageinit
# REQUIRE: mountcritlocal zfs devmatch
# BEFORE: NETWORKING
# KEYWORD: firstboot

. /etc/rc.subr

name="nuageinit"
desc="Limited Cloud Init configuration"
start_cmd="nuageinit_start"
stop_cmd=":"
rcvar="nuageinit_enable"

fetch_openstack()
{
	cd /media/nuageinit/openstack/latest
	for file in meta_data.json network_data.json user_data; do
		fetch http://169.254.169.254/openstack/latest/$file || :
	done
	if [ -f user_data ]; then
		chmod 755 user_data
	fi
	cd -
}

nuageinit_start()
{
	local citype
	# detect cloud init provider
	# according to the specification, the config drive
	# is either formatted in vfat or iso9660 and labeled
	# config-2
	for f in iso9660 msdosfs; do
		drive="/dev/$f/[cC][oO][nN][fF][iI][gG]-2"
		if [ -e $drive ]; then
			citype=config-2
			break
		fi
		drive="/dev/$f/[cC][iI][dD][aA][tT][aA]"
		if [ -e $drive ]; then
			citype=nocloud
			break
		fi
		unset drive
	done
	if [ -n "$drive" ]; then
		mkdir -p /media/nuageinit
		fs=$(fstyp $drive 2> /dev/null)
		mount -t $fs $drive /media/nuageinit
	else
		product=$(kenv smbios.system.product)
		case "$product" in
		OpenStack*)
			mkdir -p /media/nuageinit/openstack/latest
			ifaces=$(ifconfig -l ether)
			set -- $ifaces
			dhclient -p /tmp/ephemeraldhcp.pid $1
			fetch_openstack
			pkill -F /tmp/ephemeraldhcp.pid
			citype=config-2
			;;
		*)
			# try to detect networked based instance
			err 1 "Impossible to find a cloud init provider"
			;;
		esac
	fi
	# according to the specification, the content is either
	# in the openstack or ec2 directory
	case "$citype" in
	config-2)
		for d in openstack ec2; do
			dir=/media/nuageinit/$d/latest
			if [ -d $dir ]; then
				/usr/libexec/nuageinit $dir $citype 2>&1 | tee -a /var/log/nuageinit.log
				break
			fi
		done
		;;
	nocloud)
		/usr/libexec/nuageinit /media/nuageinit $citype 2>&1 | tee -a /var/log/nuageinit.log
		;;
	esac
	if [ -n "$drive" ]; then
		umount /media/nuageinit
		rmdir /media/nuageinit
	else
		rm -rf /media/nuageinit
	fi
}

load_rc_config $name
run_rc_command "$1"
